#define HI_API

#ifdef __cplusplus
extern "C" {
#endif

#include "CameraDefine.h"
#include "CameraStatus.h"
#include "common_define.h"
#include <semaphore.h>
typedef  unsigned  int u32;
#ifdef MOCK
/****test start */
typedef int VI_PIPE;
//?
typedef struct
{
    int enOpType;
    u32 u32ExpTime;
}ISP_EXPOSURE_ATTR_S_;

/****test ******/
#else
#include "hi_comm_isp.h"
#endif
//hi_comm_isp.h
//typedef struct camera_param ==>2 names
#ifndef TYPEDEF_CAMERA_PAEAM
#define TYPEDEF_CAMERA_PAEAM
/*typedef struct camera_param
{
    VI_PIPE ViPipe;
    #ifdef MOCK
    ISP_EXPOSURE_ATTR_S_ stExpAttr;
    #else
    ISP_EXPOSURE_ATTR_S stExpAttr;
    #endif
    BOOL snap;
    BOOL setparam;
    BOOL first_time_get_param;
    BOOL rtsp;

}stcamera_param;*/


typedef struct camera_param
{
    VI_PIPE ViPipe;
    ISP_EXPOSURE_ATTR_S stExpAttr;
    //扩展白平衡属性
    ISP_AWB_ATTR_EX_S stAWBAttr;
    BOOL snap;
    BOOL setparam;
    BOOL first_time_get_param;
    BOOL rtsp;
}stcamera_param;
#endif



//如果是指针的话， struct大小只有4个字节，  16 bytes , why
#ifndef TYPEDEF_CAMERA_RETURN 
#define TYPEDEF_CAMERA_RETURN
typedef struct camera_return
{
    BOOL  timeout;
    //uchar
    //这个大小应该取决于分辨率
    int FrameBufferSize;
    BYTE pFrameBuffer[MAX_BUFF_SIZE];
    tSdkFrameHead FrameInfo; 
}stcamera_return;

typedef struct snap_param
{
    struct stcamera_return *stcameraReturn;
    sem_t *sem_snap;
}stsnap_param;

#endif


#ifndef TYPEDEF_PARAM_S
#define TYPEDEF_PARAM_S
typedef struct thread_param_s
{
#if MOCK
    int tmp;
#else
    HI_S32 tmp;
#endif
    stcamera_param  stcameraParam_;
}thread_param;
#endif
/******************************************************/
// 函数名   : CameraSetAeState
// 功能描述 : 设置相机曝光的模式。自动或者手动。
// 参数     : hCamera   相机的句柄，由CameraInit函数获得。
//            bAeState    TRUE，使能自动曝光；FALSE，停止自动曝光。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraSetAeState(
    CameraHandle    hCamera,
    BOOL            bAeState
);

/******************************************************/
// 函数名   : CameraGetAeState
// 功能描述 : 获得相机当前的曝光模式。
// 参数     : hCamera  相机的句柄，由CameraInit函数获得。
//            pAeState   指针，用于返回自动曝光的使能状态。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraGetAeState(
    CameraHandle    hCamera,
    BOOL*           pAeState
);

/******************************************************/
// 函数名   : CameraSetExposureTime
// 功能描述 : 设置曝光时间。单位为微秒。对于CMOS传感器，其曝光
//        的单位是按照行来计算的，因此，曝光时间并不能在微秒
//        级别连续可调。而是会按照整行来取舍。在调用
//        本函数设定曝光时间后，建议再调用CameraGetExposureTime
//        来获得实际设定的值。
// 参数     : hCamera      相机的句柄，由CameraInit函数获得。
//            fExposureTime 曝光时间，单位微秒。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/

HI_API CameraSdkStatus  CameraSetExposureTime(
    CameraHandle    hCamera,
    double          fExposureTime
);


/******************************************************/
// 函数名   : CameraGetExposureTime
// 功能描述 : 获得相机的曝光时间。请参见CameraSetExposureTime
//        的功能描述。
// 参数     : hCamera        相机的句柄，由CameraInit函数获得。
//            pfExposureTime   指针，返回当前的曝光时间，单位微秒。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraGetExposureTime(
    CameraHandle    hCamera,
    double*         pfExposureTime
);



HI_API CameraSdkStatus  CameraSetAGainState(
    CameraHandle    hCamera,
    BOOL            bAGainState
);

HI_API CameraSdkStatus  CameraGetAGainState(
    CameraHandle    hCamera,
    BOOL*           pAGainState
);

/******************************************************/
// 函数名   : CameraSetAnalogGain
// 功能描述 : 设置相机的图像模拟增益值。该值乘以CameraGetCapability获得
//        的相机属性结构体中sExposeDesc.fAnalogGainStep，就
//        得到实际的图像信号放大倍数。
// 参数     : hCamera   相机的句柄，由CameraInit函数获得。
//            iAnalogGain 设定的模拟增益值。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraSetAnalogGain(
    CameraHandle    hCamera,
    INT             iAnalogGain
);

/******************************************************/
// 函数名   : CameraGetAnalogGain
// 功能描述 : 获得图像信号的模拟增益值。参见CameraSetAnalogGain
//        详细说明。
// 参数     : hCamera    相机的句柄，由CameraInit函数获得。
//            piAnalogGain 指针，返回当前的模拟增益值。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraGetAnalogGain(
    CameraHandle    hCamera,
    INT*            piAnalogGain
);

HI_API CameraSdkStatus  CameraSetAGainState(
        CameraHandle    hCamera,
BOOL            bAGainState
);

HI_API CameraSdkStatus  CameraGetAGainState(
        CameraHandle    hCamera,
BOOL*           pAGainState
);

/******************************************************/
// 函数名   : CameraSetAnalogGain
// 功能描述 : 设置相机的图像模拟增益值。该值乘以CameraGetCapability获得
//        的相机属性结构体中sExposeDesc.fAnalogGainStep，就
//        得到实际的图像信号放大倍数。
// 参数     : hCamera   相机的句柄，由CameraInit函数获得。
//            iAnalogGain 设定的模拟增益值。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraSetAnalogGain(
        CameraHandle    hCamera,
INT             iAnalogGain
);

/******************************************************/
// 函数名   : CameraGetAnalogGain
// 功能描述 : 获得图像信号的模拟增益值。参见CameraSetAnalogGain
//        详细说明。
// 参数     : hCamera    相机的句柄，由CameraInit函数获得。
//            piAnalogGain 指针，返回当前的模拟增益值。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraGetAnalogGain(
        CameraHandle    hCamera,
INT*            piAnalogGain
);


/*********DGain start*********/
HI_API CameraSdkStatus  CameraSetDGainState(
        CameraHandle    hCamera,
BOOL            bDGainState
);

HI_API CameraSdkStatus  CameraGetDGainState(
        CameraHandle    hCamera,
BOOL*           pDGainState
);


HI_API CameraSdkStatus  CameraSetDigitGain(
        CameraHandle    hCamera,
INT             iDigitGain
);

HI_API CameraSdkStatus  CameraGetDigitGain(
        CameraHandle    hCamera,
INT*            piDigitGain
);

/*********ISPDGain start*********/

HI_API CameraSdkStatus  CameraSetISPDGainState(
        CameraHandle    hCamera,
BOOL            bISPDGainState
);

HI_API CameraSdkStatus  CameraGetISPDGainState(
        CameraHandle    hCamera,
BOOL*           pISPDGainState
);


HI_API CameraSdkStatus  CameraSetISPDigitGain(
        CameraHandle    hCamera,
INT             iISPDigitGain
);

HI_API CameraSdkStatus  CameraGetISPDigitGain(
        CameraHandle    hCamera,
INT*            piISPDigitGain
);


/******************************************************/
// 函数名   : CameraSoftTrigger
// 功能描述 : 执行一次软触发。执行后，会触发由CameraSetTriggerCount
//          指定的帧数。
// 参数     : hCamera  相机的句柄，由CameraInit函数获得。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraSoftTrigger(
        CameraHandle    hCamera
);


/******************************************************/
// 函数名   : CameraPlay
// 功能描述 : 让SDK进入工作模式，开始接收来自相机发送的图像
//        数据。如果当前相机是触发模式，则需要接收到
//        触发帧以后才会更新图像。
// 参数     : hCamera   相机的句柄，由CameraInit函数获得。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraPlay(
        CameraHandle hCamera
);

/******************************************************/
// 函数名 	: CameraReConnect
// 功能描述	: 重新连接设备，用于USB设备意外掉线后重连
// 参数	    : hCamera	   相机的句柄，由CameraInit函数获得。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus CameraReConnect(
        CameraHandle    hCamera
);


/******************************************************/
// 函数名 	: CameraConnectTest
// 功能描述	: 测试相机的连接状态，用于检测相机是否掉线
// 参数	    : hCamera	   相机的句柄，由CameraInit函数获得。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0)，表示相机连接状态正常;
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus CameraConnectTest(
        CameraHandle    hCamera
);


/******************************************************/
// 函数名   : CameraGetImageBuffer
// 功能描述 : 获得一帧图像数据。为了提高效率，SDK在图像抓取时采用了零拷贝机制，
//        CameraGetImageBuffer实际获得是内核中的一个缓冲区地址，
//        该函数成功调用后，必须调用CameraReleaseImageBuffer释放由
//        CameraGetImageBuffer得到的缓冲区,以便让内核继续使用
//        该缓冲区。
// 参数     : hCamera   相机的句柄，由CameraInit函数获得。
//            pFrameInfo  图像的帧头信息指针。
//            pbyBuffer   指向图像的数据的缓冲区指针。由于
//              采用了零拷贝机制来提高效率，因此
//              这里使用了一个指向指针的指针。
//            UINT wTimes 抓取图像的超时时间。单位毫秒。在
//              wTimes时间内还未获得图像，则该函数
//              会返回超时信息。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
//get raw
HI_API CameraSdkStatus  CameraGetImageBuffer(
        CameraHandle        hCamera,
tSdkFrameHead*      pFrameInfo,
        BYTE**              pbyBuffer,
UINT                wTimes
);
/******************************************************/
// 函数名   : CameraImageProcess
// 功能描述 : 将获得的相机原始输出图像数据进行处理，叠加饱和度、
//        颜色增益和校正、降噪等处理效果，最后得到RGB888
//        格式的图像数据。
// 参数     : hCamera  相机的句柄，由CameraInit函数获得。
//            pbyIn    输入图像数据的缓冲区地址，不能为NULL。
//            pbyOut   处理后图像输出的缓冲区地址，不能为NULL。
//            pFrInfo  输入图像的帧头信息，处理完成后，帧头信息
//             中的图像格式uiMediaType会随之改变。
// 返回值   : 成功时，返回CAMERA_STATUS_SUCCESS (0);
//            否则返回非0值的错误码,请参考CameraStatus.h
//            中错误码的定义。
/******************************************************/
HI_API CameraSdkStatus  CameraImageProcess(
        CameraHandle        hCamera,
BYTE*               pbyIn,
        BYTE*               pbyOut,
tSdkFrameHead*      pFrInfo
);

#ifdef __cplusplus
}
#endif